#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ExtremeC_examples_chapter8_4_animal.h"
#include "ExtremeC_examples_chapter8_4_animal_p.h"

typedef struct
{
    animal_t animal;
} cat_t;

// 为猫的声音定义一个新的行为
void __cat_sound(void *ptr)
{
    animal_t *animal = (animal_t *)ptr;
    printf("%s : Meow\n", animal->name);
}

// 内存分配函数
cat_t *cat_new()
{
    return (cat_t *)malloc(sizeof(cat_t));
}

// 构造函数
void cat_ctor(cat_t *cat)
{
    animal_ctor((struct animal_t *)cat);
    strcpy(cat->animal.name, "Cat");
    // 指向新的行为函数，实际上在这里发生了重载
    cat->animal.sound_func = __cat_sound;
}

// 析构函数
void cat_dtor(cat_t *cat)
{
    animal_dtor((struct animal_t *)cat);
}